// 实现请求处理
// 提供一个简洁、重用的方式来处理异步操作及其状态（加载中、完成、错误）
// asyncFn: () => Promise<T>：一个返回 Promise 的函数，表示要执行的异步操作。这个函数应该是执行实际的异步请求（如 API 请求）。
// initValue: T：异步操作返回结果的初始值。
// immediate: true：表示这个函数在创建时是否立即执行一次异步操作。
import type { UnwrapRef } from 'vue'
import { ref } from 'vue'

export function useAsync<T>(asyncFn: () => Promise<T>, initValue: T, immediate = true) {
    const pending = ref(false)
    const data = ref(initValue)
    const error = ref(null)
    const execute = function () {
        pending.value = true
        error.value = null
        return asyncFn()
            .then((res) => {
                data.value = res as UnwrapRef<T>
                pending.value = false
            })
            .catch((err) => {
                error.value = err
                pending.value = false
            })
    }

    if (immediate) {
        execute()
    }

    return {
        pending,
        data,
        error,
        execute,
    }
}
